#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>


void *thread_run(void* args)
{
    while(1)
    {
        printf("main thread id: 0x%x\n", pthread_self());
        sleep(2);
    }
}


int main()
{

    pthread_t tid;
    pthread_create(&tid, NULL, thread_run, "new thread");


    while(1){
        printf("main thread id: 0x%x\n", pthread_self());
        sleep(1);
    }
}

















//线程控制
// #define NUM 3
// void *thread_run(void *args)
// {
//     //分离线程
//     //线程分离表示不需要等待
//    pthread_detach(pthread_self());
//    int num = *(int*)args;
//    while(1){
//        printf("我是新线程[%d], 我创建的线程ID是: %lu\n", num,pthread_self());
//        sleep(2);
//        //break;
//        //野指针问题
//        //if(num == 3){
//        //    printf("thread number : %d quit\n", num);
//        //    int *p = NULL;
//        //    *p = 1000;
//        //}
//    }

//     //返回值除了是整形还可以是其他变量，可以是对象的地址（不能是临时的）
//     //exit(123);
    
//     //pthread_exit((void*)123);
//     return (void*)111;
// }

// int main()
// {
//     //创建多线程
//     pthread_t tid[NUM];
//     int i=0;
//     for(i;i<NUM;i++){
//      pthread_create(tid+i,NULL,thread_run,(void *)&i);
//      sleep(1);
//     }

//     printf("wait sub thread....\n");
//     sleep(3);
//     printf("cancel sub thread...\n");

//     //线程取消
//    // pthread_cancel(tid[0]);

//     void *status=NULL; //指针变量本身就可以充当某种容器保存数据
   
//     int ret = 0;

//     for(i = 0; i < NUM; i++){
//        ret = pthread_join(tid[i], &status); //线程等待
//    }

//     printf("ret: %d, status: %d\n", ret, (int)status);
//     sleep(3);
//     // while(1){
//     //     printf("###############beging################################### \n");
//     //     printf("i am main pthread,i  ID is:%lu\n",pthread_self());
//     //     for(i=0;i<5;i++){
//     //         printf("我创建的线程[%d]是:%lu\n",i,tid[i]);
//     //     }
//     //     printf("###############end################################### \n");
//     //     sleep(1);
//     // }

//     return 0;
// }


